// Observer 类将一个 object 转换成每个层级的属性都可以被监测到的 object
class Observer {
  constructor(data) {
    this.walk(data);
  }

  // 对数据对象进行递归遍历
  walk(data) {
    if (!data || typeof data !== "object") {
      return;
    }
    Object.keys(data).forEach((key) => {
      this.defineReactive(data, key, data[key]);
    });
  }

  defineReactive(obj, key, val) {
    // 创建一个依赖收集器
    const dep = new Dep();
    Object.defineProperty(obj, key, {
      // 使对象可枚举
      enumerable: true,
      // 该属性为 true 时，属性的值才可以被改变，且能从对应的对象上删除
      configurable: true,
      get() {
        // 添加观察者对象
        if (Dep.target) {
          dep.addSub(Dep.target);
        }
        return val;
      },
      set(newVal) {
        // 如果当前的 val参数 和 传入的新值相等 就什么都不做直接 return
        if (val === newVal) {
          return;
        }
        val = newVal;
        // 触发依赖更新
        dep.notify();
      },
    });
  }
}
